package cn.itcast.dmp.config

import java.util
import java.util.Map

import com.typesafe.config.{Config, ConfigFactory, ConfigValue}
import org.apache.spark.sql.SparkSession

/**
  * 读取Spark Application应用参数属性值，从spark.conf中读取，并设置到SparkConf中
  */
class SparkConfigHelper(builder: SparkSession.Builder) {

	// 1、加载属性配置文件, 指定属性文件的名称
	val config: Config = ConfigFactory.load("spark.conf")

	// 加载属性配置，通过SparkSession.Builder进行设置   在这个方法中定义要实现的功能
	def loadSparkConf(): SparkSession.Builder ={

		// 2、获取配置文件中属性信息
		val entrySet: util.Set[Map.Entry[String, ConfigValue]] = config.entrySet()
		// 遍历集合Set  因为Set是java中的类型，所以要进行转换
		import scala.collection.JavaConverters._
		for(entry <- entrySet.asScala){
			// 获取每个Entry来源的名称
			val resourceName = entry.getValue.origin().resource()
			//如果匹配到spark.conf，那就把spark.conf的属性设置到build中
			if("spark.conf".equals(resourceName)){
				// TODO: 设置每个属性的值到Builder对象中，这里的配置信息很多大概有9对属性
				builder.config(entry.getKey, entry.getValue.unwrapped().toString)
			}
		}

		// 返回Builder对象
		builder
	}

}

object SparkConfigHelper{

	// 隐式转换函数，将SparkSession.Builder转换为SparkConfigHelper实例对象
	//传递一个build对象，返回上面的SparkConfigHelper类的对象，而这个类中又定义了loadSparkConf方法，所以就事项了隐式转换
	implicit def builderToHelper(builder: SparkSession.Builder): SparkConfigHelper ={
		new SparkConfigHelper(builder)
	}

}
